﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Helena.Areas.Productos.Models;
using Telerik.Web.Mvc;
using Helena.Areas.Categorias.Models;
using Helena.Areas.Campanas.Models;
using Helena.Areas.Configuraciones.Models;
using System.Threading;
using Helena.Areas.Vendedores.Models;
using Helena.Areas.Ventas.Models;
using Helena.Areas.Clientes.Models;
using Helena.Areas.Reportes.Models;
using System.Collections;
using System.IO;
using System.Text;
using Helena.Models;

namespace Helena.Areas.Reportes.Controllers
{
    public class CierreCajaController : Controller
    {
        LogicaVenta vta_db = new LogicaVenta();
        LogicaUnidad uni_db = new LogicaUnidad();
        LogicaProducto pro_db = new LogicaProducto();
        LogicaConfiguraciones conf_db = new LogicaConfiguraciones();
        LogicaCliente cli_db = new LogicaCliente();
        LogicaVendedor vnd_db = new LogicaVendedor();
        LogicaTarjeta tar_db = new LogicaTarjeta();
        LogicaCierreCaja cierre = new LogicaCierreCaja();
        //
        // GET: /Reportes/CierreCaja/

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index()
        {
                 return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(CierreCaja c)
        {
            DateTime fecha = c.fecha;
            string cadena = "";
            string aux;
            string imprimir = String.Empty;
            
            imprimir = conf_db.ObtenerLocal().NombreLocal + "\n\n";
            imprimir += "Cierre Diario\n\n";
            imprimir += "Vendedor (a): " + vnd_db.cabecera() + "\n\n";
            imprimir += "Venta del Dia: " + fecha.ToShortDateString() + "\n\n";


            CierreCaja caja = new CierreCaja();
            List<VentaView> v = vta_db.i_RetornarVentas().Where(m => m.Fecha.DayOfYear == fecha.DayOfYear).ToList();
            
            Session["VentasEnElDia"] = v;
            caja.Vendedor = vnd_db.VendedorActivo().NombreLargo;
            caja.fecha = fecha;

            caja.TotalVentaBruta = v.Where(s => s.Estado == true).Sum(s => s.Total_En_Soles);
            caja.TotalDescuento = caja.TotalVentaBruta-v.Where(s => s.Estado == true).Sum(s => s.Sub_Total);
            caja.TotalVentaNeta = caja.TotalVentaBruta - caja.TotalDescuento;

            caja.TotalEfectivo = v.Where(s => s.Estado == true).Sum(s => s.Pago_en_Efectivo_en_Soles) - v.Where(s => s.Estado == true).Sum(s => s.Vuelto); 


            caja.Pagos_de_venta_TarjetaSoles= v.Where(s => s.Estado == true).Sum(s => s.Pago_con_Tarjeta_en_Soles);
            caja.Pagos_de_Venta_en_Dolares = v.Where(s => s.Estado == true).Sum(s => s.Pago_en_Efectivo_en_Dolares);


            if (caja.TotalEfectivo >= c.DisponibleCaja)
            {
                caja.Resultado = "Sobrante: S/." + Convert.ToString(caja.TotalEfectivo - c.DisponibleCaja) + "\n\n";
            }
            else
            {
                caja.Resultado = "Faltante: S/." + Convert.ToString(-1 * (caja.TotalEfectivo - c.DisponibleCaja)) + "\n\n";
            }

            caja.NTicket = v.Where(m => m.Ticket > 0).Where(l => l.Estado == true).Count();
            caja.NTicketAnulados = v.Where(m => m.Ticket > 0).Where(t => t.Estado == false).Count();

            try
            {
                aux = v.Where(m => m.Ticket > 0).Min(l => l.Ticket).ToString();
            }
            catch
            { 
                aux = "0";
            }

            cadena = "";
            for (int i = aux.Length; i < 8; i++) { cadena = "0" + cadena; }
            caja.InicioTicket = "001-"+cadena+aux;

            try
            {
                aux = v.Where(m => m.Ticket > 0).Max(l => l.Ticket).ToString();
            }
            catch
            {
                aux = "0";
            }
            
            cadena = "";
            for (int i = aux.Length; i < 8; i++) { cadena = "0" + cadena; }
            caja.FinTicket = "001-" + cadena + aux;

            caja.TotalTicketSoles = v.Where(m => m.Ticket > 0).Where(l => l.Estado == true).Sum(l => l.Total_En_Soles);
            caja.TotalTicketDolares = v.Where(m => m.Ticket > 0).Where(l => l.Estado == true).Sum(l => l.Total_En_Dolares);

            caja.NBoleta = v.Where(m => m.Boleta > 0).Where(l => l.Estado == true).Count();
            caja.NBoletaAnulados = v.Where(m => m.Boleta > 0).Where(l => l.Estado == false).Count();

            try
            {
                aux = v.Where(m => m.Boleta > 0).Min(l => l.Boleta).ToString();
            }
            catch
            {
                aux = "0";
            }

            cadena = "";
            for (int i = aux.Length; i < 8; i++) { cadena = "0" + cadena; }
            caja.InicioBoleta = cadena + aux;

            try
            {
                aux = v.Where(m => m.Boleta > 0).Max(l => l.Boleta).ToString();
            }
            catch
            {
                aux = "0";
            }

            cadena = "";
            for (int i = aux.Length; i < 8; i++) { cadena = "0" + cadena; }
            caja.FinBoleta = cadena+aux;

            caja.TotalBoletaSoles = v.Where(m => m.Boleta > 0).Where(l => l.Estado == true).Sum(l => l.Total_En_Soles);
            caja.TotalBoletaDolares = v.Where(m => m.Boleta > 0).Where(l => l.Estado == true).Sum(l => l.Total_En_Dolares);

            caja.NFactura = v.Where(m => m.Factura > 0).Where(l => l.Estado == true).Count();
            caja.NFacturaAnulados = v.Where(m => m.Factura > 0).Where(l => l.Estado == false).Count();

            try
            {
                aux = v.Where(m => m.Factura > 0).Min(l => l.Factura).ToString();
            }
            catch
            {
                aux = "0";
            }

            cadena = "";
            for (int i = aux.Length; i < 8; i++) { cadena = "0" + cadena; }
            caja.InicioFactura = cadena + aux;

            try
            {
                aux = v.Where(m => m.Factura > 0).Max(l => l.Factura).ToString();
            }
            catch
            {
                aux = "0";
            }

            cadena = "";
            for (int i = aux.Length; i < 8; i++) { cadena = "0" + cadena; }
            caja.FinFactura = cadena+aux;

            caja.TotalFacturaSoles = v.Where(m => m.Factura > 0).Where(l => l.Estado == true).Sum(l => l.Total_En_Soles);
            caja.TotalFacturaDolares = v.Where(m => m.Factura > 0).Where(l => l.Estado == true).Sum(l => l.Total_En_Dolares);

            caja.TipoCambio = conf_db.ObtenerUltimaConfiguracion().TipoCambio;

            List<Venta> lnv = new List<Venta>();
            
            foreach (VentaView xv in v)
            {
                Venta nv = new Venta();

                nv.Ticket =xv.Ticket;
                nv.Boleta =xv.Boleta;
                nv.Factura =xv.Factura;
                nv.clienteID =xv.ClienteID;
                nv.Descripcion =xv.Descripcion;
                nv.vendedorID =xv.VendedorID;
                nv.Fecha =xv.Fecha;
                nv.Sub_Total =xv.Sub_Total;
                nv.Descuento =xv.Descuento;
                nv.Total_En_Soles =xv.Total_En_Soles;
                nv.Total_En_Dolares=xv.Total_En_Dolares;
                nv.Valor_Del_Igv_En_Soles =xv.Valor_Del_Igv_En_Soles;
                nv.ValorTipoCambio =xv.ValorTipoCambio;
                nv.Pago_con_Tarjeta_en_Soles =xv.Pago_con_Tarjeta_en_Soles;
                nv.Pago_en_Efectivo_en_Soles =xv.Pago_en_Efectivo_en_Soles;
                nv.Pago_en_Efectivo_en_Dolares =xv.Pago_en_Efectivo_en_Dolares;
                nv.Vuelto =xv.Vuelto;
                nv.tarjetaID =xv.tarjetaID;
                lnv.Add(nv);
            }

            caja.Ventas=lnv;
            
            imprimir += "-----Control de Ventas-----" + "\n\n";
            imprimir += "Venta Bruta:     S/." + caja.TotalVentaBruta + "\n";
            imprimir += "Venta Descuento: S/." + caja.TotalDescuento + "\n";
            imprimir += "Venta Neta:      S/." + caja.TotalVentaNeta + "\n\n\n\n";
                     
            imprimir += "Total Pago Dolares: US$/." + caja.Pagos_de_Venta_en_Dolares + "\n";
            imprimir += "Total Pago Tarjeta: S/." + caja.Pagos_de_venta_TarjetaSoles + "\n";

            imprimir += caja.Resultado + "\n\n";

            
            
            imprimir += "-----Control de Documentos-----" + "\n\n";

            imprimir += "Ticket-Fact" + "\n";
            imprimir += "#Inicio  : " + caja.InicioTicket + "\n"; 
            imprimir += "#Fin: " + caja.FinTicket + "\n";
            imprimir += "Cant: " + caja.NTicket + "  Anulado: " + caja.NTicketAnulados + "\n";
            imprimir += "Total: S/" + caja.TotalTicketSoles + " Total: US$" + caja.TotalTicketDolares + "\n\n";

            imprimir += "Boleta Venta" + "\n";
            imprimir += "#Inicio  : " + caja.InicioBoleta + "\n"; 
            imprimir += "#Fin: " + caja.FinBoleta + "\n";
            imprimir += "Cant: " + caja.NBoleta + "  Anulado: " + caja.NBoletaAnulados + "\n";
            imprimir += "Total: S/" + caja.TotalBoletaSoles + " Total: US$" + caja.TotalBoletaDolares + "\n\n";

            imprimir += "Factura" + "\n";
            imprimir += "#Inicio  : " + caja.InicioFactura + "\n";
            imprimir += "#Fin: " + caja.FinFactura + "\n";
            imprimir += "Cant: " + caja.NFactura + "  Anulado: " + caja.NFacturaAnulados + "\n";
            imprimir += "Total: S/" + caja.TotalFacturaSoles + " Total: US$" + caja.TotalFacturaDolares + "\n\n\n\n\n\n\n\n\n\n\n.";
            Session["CierreCaja"] = imprimir;

            cierre.GuardarCierreCaja(caja,caja.fecha);

            return View(caja);
        }

        [GridAction]
        public ActionResult Ventas()
        {
            List<VentaView> v = (List<VentaView>)Session["VentasEnElDia"];
            return View("Index", new GridModel(v));
        }

        public ActionResult Imprimir()
        {
            // a la impresora

            string imprimir = Session["CierreCaja"].ToString();

            Util.ImprimirCierreCaja(imprimir);

            string[] reporte = imprimir.Split(new Char[] { '\n' });

            MemoryStream output = new MemoryStream();
            StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
            foreach (string r in reporte)
            {
                writer.Write(r);
                writer.Write(",");
                writer.WriteLine();
            }
            writer.Flush();
            output.Position = 0;

            return File(output, "text/comma-separated-values", "Reporte_" + DateTime.Now.ToShortDateString() + ".csv");
        }

        [GridAction]
        public ActionResult _DetalleVenta(int VentaID)
        {
            return View(new GridModel(vta_db.DetallesDeUnaVenta2(VentaID)));
        }

    }
}
